sets 是一個沒有順序性
而且元素不能重複
的集合.
建立 set 的方式,可以使用 set(list).
>>> nums = set([1,2,3,4,2,5])
>>> type(nums)
<class 'set'>
>>> print(nums)
{1, 2, 3, 4, 5}
也可以使用 { } 包住元素建立.
>>> nums2 = {5,6,7,8,8,8}
>>> type(nums2)
<class 'set'>
>>> print(nums2)
{8, 5, 6, 7}
新增元素到 set.
>>> nums.add(10)
>>> nums.add(11)
>>> print(nums)
{1, 2, 3, 4, 5, 10, 11}
update 可以一次新增多個元素,重複的會被取代掉.
>>> nums.update([9,8,7])
>>> print(nums)
{1, 2, 3, 4, 5, 7, 8, 9, 10, 11}
使用 remove 移除元素.
>>> nums.remove(5)
>>> print(nums)
{1, 2, 3, 4, 7, 8, 9, 10, 11}
使用 union 相加兩個 set.
>>> nums1 = {1,2,3}
>>> nums2 = {3,4,5}
>>> nums = nums1.union(nums2)
>>> print(nums)
{1, 2, 3, 4, 5}
使用 clear 清空 set.
>>> nums.clear()
>>> print(nums)
set()
迭代 set 元素.
>>> for n in nums1:
... print(n)
...
1
2
3
判斷元素是否存在 set.
>>> 3 in nums1
True
>>> 3 not in nums1
False
set 提供了一些運算子可對兩個 set 操作, union (|), intersection (&), difference (-), and xor (^).
差集
>>> nums = {0,1,2,3,4,5,6,7,8,9,10}
>>> odds = {1,3,5,7,9,11}
>>> even = nums - odds
>>> print(even)
{0, 2, 4, 6, 8, 10}
聯集
>>> print(even | odds)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}
交集
>>> print(nums & even)
{0, 2, 4, 6, 8, 10}
互斥或
>>> print(nums ^ even)
{1, 3, 5, 7, 9}
遞迴可以對某個集合,逐一取得裡面的元素做處理,使用 for.
>>> nums1 = {1,2,3}
>>> for n in nums1:
... print(n)
...
1
2
3
也可以根據條件式來判斷迴圈是否需要一直執行,使用 while.
>>> sum = 3
>>> while sum > 0:
... print(sum)
... sum = sum - 1
...
3
2
1
使用 for range 可以印出連續的數組.
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
>>> for i in range(2,5):
... print(i)
...
2
3
4
再利用 for range 來表示 index 逐一取得 list 的元素.
>>> names = ['Sam','Daniel','Jack']
>>> for i in range(len(names)):
... print(i , names[i])
...
0 Sam
1 Daniel
2 Jack
更簡單的方式是使用 enumerate 就可以取得 index 跟 value 了.
>>> names = ['Sam','Daniel','Jack']
>>> for i,v in enumerate(names):
... print(i,v)
...
0 Sam
1 Daniel
2 Jack
使用 break 停止迴圈.
>>> for i,v in enumerate(names):
... if(i == 1):
... break
... print(i,v)
...
0 Sam
使用 continue 跳過該次迴圈.
>>> for i,v in enumerate(names):
... if(i == 1):
... continue
... print(i,v)
...
0 Sam
2 Jack
由於 list 是 mutable 的,所以當在迭代 list 元素時,如果使用了 remove 後面元素的 index 也會往前了.所以就會導致例如下面的問題.
>>> names = ['Sam','Daniel','Jack','Allen','Bob']
>>> for i,name in enumerate(names):
... if name not in ['Daniel','Jack']:
... names.remove(name)
... print(i,name)
...
0 Sam
1 Jack
2 Allen
>>> print(names)
['Daniel', 'Jack', 'Bob']
可以使用 copy 的方式,不要被已經被更動的 list 影響.
>>> names = ['Sam','Daniel','Jack','Allen','Bob']
>>> for i,name in enumerate(names.copy()):
... if name not in ['Daniel','Jack']:
... names.remove(name)
... print(i,name)
...
0 Sam
1 Daniel
2 Jack
3 Allen
4 Bob
>>> print(names)
['Daniel', 'Jack']
使用 slice copy 的方式,也可以達到一樣的效果.
>>> names = ['Sam','Daniel','Jack','Allen','Bob']
>>> for i,name in enumerate(names[:]):
... if name not in ['Daniel','Jack']:
... names.remove(name)
... print(i,name)
...
0 Sam
1 Daniel
2 Jack
3 Allen
4 Bob
>>> print(names)
['Daniel', 'Jack']
雙層迴圈
>>> for i in range(1,5):
... for j in range(1,6,2):
... print(i,j)
...
1 1
1 3
1 5
2 1
2 3
2 5
3 1
3 3
3 5
4 1
4 3
4 5